package cn.edu.tju.elm.service;

import cn.edu.tju.elm.model.VirtualWallet;
import cn.edu.tju.elm.model.VirtualWalletTransaction;
import cn.edu.tju.core.model.User;

import java.math.BigDecimal;
import java.util.List;
import java.util.Optional;

/**
 * 虚拟钱包服务接口
 * Service层负责协调Domain层的业务逻辑，处理事务，调用Repository
 */
public interface VirtualWalletService {
    
    // ==================== 基础查询方法 ====================
    
    /**
     * 根据钱包ID获取虚拟钱包
     * @param walletId 钱包ID
     * @return 虚拟钱包
     */
    Optional<VirtualWallet> getVirtualWallet(Long walletId);
    
    /**
     * 根据用户获取虚拟钱包
     * @param user 用户
     * @return 虚拟钱包
     */
    Optional<VirtualWallet> getVirtualWalletByUser(User user);
    
    /**
     * 根据用户ID获取虚拟钱包
     * @param userId 用户ID
     * @return 虚拟钱包
     */
    Optional<VirtualWallet> getVirtualWalletByUserId(Long userId);
    
    /**
     * 获取钱包余额
     * @param walletId 钱包ID
     * @return 余额
     */
    BigDecimal getBalance(Long walletId);
    
    /**
     * 创建用户虚拟钱包
     * @param user 用户
     * @return 创建的虚拟钱包
     */
    VirtualWallet createVirtualWallet(User user);
    
    // ==================== 充值和提现 ====================
    
    /**
     * 充值（应用充值返点规则）
     * @param walletId 钱包ID
     * @param amount 充值金额
     * @param remark 备注
     * @return 交易记录
     */
    VirtualWalletTransaction recharge(Long walletId, BigDecimal amount, String remark);
    
    /**
     * 提现（应用提现手续费规则）
     * @param walletId 钱包ID
     * @param amount 提现金额
     * @param remark 备注
     * @return 交易记录
     */
    VirtualWalletTransaction withdraw(Long walletId, BigDecimal amount, String remark);
    
    // ==================== 转账和支付 ====================
    
    /**
     * 转账（钱包到钱包转账）
     * @param fromWalletId 转出钱包ID
     * @param toWalletId 转入钱包ID
     * @param amount 转账金额
     * @param orderId 关联订单ID（可选）
     * @param remark 备注
     * @return 是否成功
     */
    boolean transfer(Long fromWalletId, Long toWalletId, BigDecimal amount, Long orderId, String remark);
    
    /**
     * 支付订单（冻结资金）
     * @param walletId 钱包ID
     * @param amount 支付金额
     * @param orderId 订单ID
     * @return 是否成功
     */
    boolean payOrder(Long walletId, BigDecimal amount, Long orderId);
    
    /**
     * 确认收货（扣除冻结资金并转给商家）
     * @param buyerWalletId 买家钱包ID
     * @param sellerWalletId 卖家钱包ID
     * @param amount 金额
     * @param orderId 订单ID
     * @return 是否成功
     */
    boolean confirmOrder(Long buyerWalletId, Long sellerWalletId, BigDecimal amount, Long orderId);
    
    /**
     * 取消订单（解冻资金）
     * @param walletId 钱包ID
     * @param amount 金额
     * @param orderId 订单ID
     * @return 是否成功
     */
    boolean cancelOrder(Long walletId, BigDecimal amount, Long orderId);
    
    /**
     * 退款
     * @param sellerWalletId 卖家钱包ID
     * @param buyerWalletId 买家钱包ID
     * @param amount 退款金额
     * @param orderId 订单ID
     * @return 是否成功
     */
    boolean refund(Long sellerWalletId, Long buyerWalletId, BigDecimal amount, Long orderId);
    
    // ==================== 冻结和解冻 ====================
    
    /**
     * 冻结资金
     * @param walletId 钱包ID
     * @param amount 冻结金额
     * @param remark 备注
     * @return 是否成功
     */
    boolean freezeAmount(Long walletId, BigDecimal amount, String remark);
    
    /**
     * 解冻资金
     * @param walletId 钱包ID
     * @param amount 解冻金额
     * @param remark 备注
     * @return 是否成功
     */
    boolean unfreezeAmount(Long walletId, BigDecimal amount, String remark);
    
    /**
     * 冻结钱包
     * @param walletId 钱包ID
     * @return 是否成功
     */
    boolean freezeWallet(Long walletId);
    
    /**
     * 解冻钱包
     * @param walletId 钱包ID
     * @return 是否成功
     */
    boolean unfreezeWallet(Long walletId);
    
    // ==================== VIP和透支管理 ====================
    
    /**
     * 设置VIP
     * @param walletId 钱包ID
     * @param overdraftLimit 透支额度
     * @return 是否成功
     */
    boolean setVip(Long walletId, BigDecimal overdraftLimit);
    
    /**
     * 取消VIP
     * @param walletId 钱包ID
     * @return 是否成功
     */
    boolean cancelVip(Long walletId);
    
    /**
     * 还款（偿还透支）
     * @param walletId 钱包ID
     * @param amount 还款金额
     * @return 交易记录
     */
    VirtualWalletTransaction repay(Long walletId, BigDecimal amount);
    
    /**
     * 计算透支利息
     * @param walletId 钱包ID
     * @return 利息金额
     */
    BigDecimal calculateInterest(Long walletId);
    
    /**
     * 支付利息
     * @param walletId 钱包ID
     * @return 交易记录
     */
    VirtualWalletTransaction payInterest(Long walletId);
    
    // ==================== 交易记录查询 ====================
    
    /**
     * 获取交易记录
     * @param walletId 钱包ID
     * @return 交易记录列表
     */
    List<VirtualWalletTransaction> getTransactionHistory(Long walletId);
    
    /**
     * 根据订单ID获取交易记录
     * @param orderId 订单ID
     * @return 交易记录列表
     */
    List<VirtualWalletTransaction> getTransactionsByOrderId(Long orderId);
    
    /**
     * 根据交易类型获取交易记录
     * @param walletId 钱包ID
     * @param transactionType 交易类型
     * @return 交易记录列表
     */
    List<VirtualWalletTransaction> getTransactionsByType(Long walletId, String transactionType);
}
